package work.base.designpattern.single;

/**
 * 单例模式 懒汉式加载
 * 虽然优化了效率 但是多线程环境下 调用getInstance()  会new出多个对象 带来线程安全问题
 * 解决方法 : 使用synchronized关键字 保证线程安全
 */
public class SingleTest03 {

    private static SingleTest03 INSTANCE;

    private SingleTest03(){};

    /**
     * 调用 getInstance的时候再去加载
     * 类装载的时候先不new进行实例化
     * @return
     */
    public synchronized static SingleTest03 getInstance() {
        if(null == INSTANCE) {
            try {
                Thread.sleep(1);
            }catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            INSTANCE = new SingleTest03();
        }
        return INSTANCE;
    }


    public static void main(String[] args) {
        // 多线程采用懒汉式的单例模式 会造成new出多个对象
        // synchronized 加锁 可以解决该问题
        for(int i=0 ; i<100;i++) {
            new Thread(()->{
                System.out.println(SingleTest03.getInstance().hashCode());
            }).start();
        }
    }
}
